// 定义一个编译时的类型链表结构
template <typename Head, typename Tail>
struct Typelist {
    using head = Head;  // 当前节点存储的类型
    using tail = Tail;  // 链表的下一部分，也是一个 Typelist 或 NullType
};

// 定义一个特殊的类型表示链表的结束
struct NullType {};

// 构造一个类型链表
using MyTypes = Typelist<int, Typelist<char, Typelist<double, NullType>>>;

// 用于访问和打印 Typelist 中的类型信息
#include <iostream>
#include <typeinfo>

// 递归遍历 Typelist 并打印类型信息
template <typename List>
void printTypelist() {
    std::cout << typeid(typename List::head).name() << " -> ";
    printTypelist<typename List::tail>();
}

// 特化用于结束递归的情况
template <>
void printTypelist<NullType>() {
    std::cout << "NullType" << std::endl;
}

int main() {
    std::cout << "Typelist contains types: ";
    printTypelist<MyTypes>();
    return 0;
}